home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / HTTP.php < prev    next >
PHP Script  |  2004-03-24  |  8KB  |  209 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2003 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Stig Bakken <ssb@fast.no>                                   |
  17. // |                                                                      |
  18. // +----------------------------------------------------------------------+
  19. //
  20. // $Id: HTTP.php,v 1.23 2004/02/24 11:25:24 pajoye Exp $
  21. //
  22. // HTTP utility functions.
  23. //
  24.  
  25. class HTTP
  26. {
  27.     /**
  28.      * Format a RFC compliant HTTP header.  This function
  29.      * honors the "y2k_compliance" php.ini directive.
  30.      *
  31.      * @param int $time UNIX timestamp
  32.      *
  33.      * @return mixed HTTP date string, or false for an invalid timestamp.
  34.      *
  35.      * @author Stig Bakken <ssb@fast.no>
  36.      * @author Sterling Hughes <sterling@php.net>
  37.      */
  38.     function Date($time)
  39.     {
  40.         /* If we're y2k compliant, use the newer, reccomended RFC 822
  41.            format */
  42.         if (ini_get("y2k_compliance") == true) {
  43.             return gmdate("D, d M Y H:i:s \G\M\T", $time);
  44.         }
  45.         /* Use RFC-850 which supports two character year numbers */
  46.         else {
  47.             return gmdate("F, d-D-y H:i:s \G\M\T", $time);
  48.         }
  49.     }
  50.  
  51.     /**
  52.      * Negotiate language with the user's browser through the
  53.      * Accept-Language HTTP header or the user's host address.
  54.      * Language codes are generally in the form "ll" for a language
  55.      * spoken in only one country, or "ll-CC" for a language spoken in
  56.      * a particular country.  For example, U.S. English is "en-US",
  57.      * while British English is "en-UK".  Portugese as spoken in
  58.      * Portugal is "pt-PT", while Brazilian Portugese is "pt-BR".
  59.      * Two-letter country codes can be found in the ISO 3166 standard.
  60.      *
  61.      * Quantities in the Accept-Language: header are supported, for
  62.      * example:
  63.      *
  64.      *  Accept-Language: en-UK;q=0.7, en-US;q=0.6, no;q=1.0, dk;q=0.8
  65.      *
  66.      * @param array $supported an associative array indexed by language
  67.      * codes (country codes) supported by the application.  Values
  68.      * must evaluate to true.
  69.      *
  70.      * @param string $default the default language to use if none is found
  71.      * during negotiation, defaults to "en-US" for U.S. English
  72.      *
  73.      * @return string the negotiated language result
  74.      *
  75.      * @author Stig Bakken <ssb@fast.no>
  76.      */
  77.     function negotiateLanguage(&$supported, $default = 'en-US')
  78.     {
  79.         $supported = array_change_key_case($supported, CASE_LOWER);
  80.  
  81.         /* If the client has sent an Accept-Language: header, see if
  82.          * it contains a language we support.
  83.          */
  84.         if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
  85.             $accepted = split(',[[:space:]]*', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
  86.             for ($i = 0; $i < count($accepted); $i++) {
  87.                 if (eregi('^([a-z_-]+);[[:space:]]*q=([0-9\.]+)', $accepted[$i], $arr)) {
  88.                     $q = (double)$arr[2];
  89.                     $l = $arr[1];
  90.                 } else {
  91.                     $q = 42;
  92.                     $l = strtolower($accepted[$i]);
  93.                 }
  94.  
  95.                 if (!empty($supported[$l]) && ($q > 0.0)) {
  96.                     if ($q == 42) {
  97.                         return $l;
  98.                     }
  99.                     $candidates[$l] = $q;
  100.                 }
  101.             }
  102.             if (isset($candidates)) {
  103.                 arsort($candidates);
  104.                 reset($candidates);
  105.                 return key($candidates);
  106.             }
  107.         }
  108.  
  109.         /* Check for a valid language code in the top-level domain of
  110.          * the client's host address.
  111.          */
  112.         if (isset($_SERVER['REMOTE_HOST']) &&
  113.             ereg("\.[^\.]+$", $_SERVER['REMOTE_HOST'], $arr)) {
  114.             $lang = strtolower($arr[1]);
  115.             if (!empty($supported[$lang])) {
  116.                 return $lang;
  117.             }
  118.         }
  119.  
  120.         return $default;
  121.     }
  122.  
  123.     /**
  124.     * Sends a "HEAD" HTTP command to a server and returns the headers
  125.     * as an associative array. Example output could be:
  126.     *    Array
  127.     *    (
  128.     *        [response_code] => 200          // The HTTP response code
  129.     *        [response] => HTTP/1.1 200 OK   // The full HTTP response string
  130.     *        [Date] => Fri, 11 Jan 2002 01:41:44 GMT
  131.     *        [Server] => Apache/1.3.20 (Unix) PHP/4.1.1
  132.     *        [X-Powered-By] => PHP/4.1.1
  133.     *        [Connection] => close
  134.     *        [Content-Type] => text/html
  135.     *    )
  136.     *
  137.     * @param string $url A valid url, for ex: http://pear.php.net/credits.php
  138.     * @return mixed Assoc array or PEAR error
  139.     *
  140.     * @author Tomas V.V.Cox <cox@idecnet.com>
  141.     */
  142.     function head($url)
  143.     {
  144.         $purl = parse_url($url);
  145.         $port = (isset($purl['port'])) ? $purl['port'] : 80;
  146.         $fp = @fsockopen($purl['host'], $port, $errno, $errstr, 10);
  147.         if (!$fp) {
  148.             include_once "PEAR.php";
  149.             return PEAR::raiseError("HTTP::head error $errstr ($erno)");
  150.         }
  151.         $path = (!empty($purl['path'])) ? $purl['path'] : '/';
  152.         $path .= (!empty($purl['query'])) ? '?' . $purl['query'] : '';
  153.  
  154.         fputs($fp, "HEAD $path HTTP/1.0\r\n");
  155.         fputs($fp, "Host: " . $purl['host'] . "\r\n");
  156.         fputs($fp, "Connection: close\r\n\r\n");
  157.  
  158.         $response = rtrim(fgets($fp, 4096));
  159.         if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|", $response, $status)) {
  160.             $headers['response_code'] = $status[1];
  161.         }
  162.         $headers['response'] = $response;
  163.  
  164.         while ($line = fgets($fp, 4096)) {
  165.             if (!trim($line)) {
  166.                 break;
  167.             }
  168.             if (($pos = strpos($line, ':')) !== false) {
  169.                 $header = substr($line, 0, $pos);
  170.                 $value  = trim(substr($line, $pos + 1));
  171.                 $headers[$header] = $value;
  172.             }
  173.         }
  174.         fclose($fp);
  175.         return $headers;
  176.     }
  177.  
  178.     /**
  179.     * This function redirects the client. This is done by issuing
  180.     * a Location: header and exiting.
  181.     *
  182.     * @author Richard Heyes <richard@php.net>
  183.     * @param  string $url URL where the redirect should go to
  184.     */
  185.     function redirect($url)
  186.     {
  187.         if (!preg_match('/^(https?|ftp):\/\//', $url)) {
  188.             $server = 'http' . (@$_SERVER['HTTPS'] == 'on' ? 's' : '') . '://' . $_SERVER['SERVER_NAME'];
  189.             if ($_SERVER['SERVER_PORT'] != 80 &&
  190.                 $_SERVER['SERVER_PORT'] != 443) {
  191.                 $server .= ':' . $_SERVER['SERVER_PORT'];
  192.             }
  193.             
  194.             $path = dirname($_SERVER['PHP_SELF']);
  195.             if ($url{0} != '/') {
  196.                 $path   .= $url;
  197.                 $server .= dirname($_SERVER['PHP_SELF']);
  198.                 $url = $server . '/' . preg_replace('!^\./!', '', $url);
  199.             } else {
  200.                 $url = $server . $url;
  201.             }
  202.         }
  203.  
  204.         header('Location: ' . $url);
  205.         exit;
  206.     }
  207. }
  208. ?>
  209.